package com.huitong.admin.system.service.impl;

import com.huitong.admin.system.domain.dto.CollegeDTO;
import com.huitong.admin.system.domain.dto.CollegePageDTO;
import com.huitong.admin.system.domain.po.CollegePO;
import com.huitong.admin.system.domain.vo.CollegeVO;
import com.huitong.admin.system.mapper.CollegeMapper;
import com.huitong.admin.system.service.CollegeService;
import com.huitong.common.core.domain.Result;
import com.huitong.common.mybatis.domain.PageResult;
import com.huitong.common.mybatis.utils.PageUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.huitong.common.redis.constant.CacheConstant.COLLEGE_KEY_NAME;

/**
 * 学院信息服务层
 *
 * @author fromdrowning
 * @date 2024/4/27 下午12:35
 */
@RequiredArgsConstructor
@Service
public class CollegeServiceImpl implements CollegeService {

    /**
     * 学院信息数据访问层
     */
    private final CollegeMapper collegeMapper;

    /**
     * 新增学院信息
     *
     * @param collegeDTO 学院信息
     */
    @CacheEvict(cacheNames = COLLEGE_KEY_NAME)
    @Override
    public void insertCollege(CollegeDTO collegeDTO) {
        CollegePO collegePO = new CollegePO();
        BeanUtils.copyProperties(collegeDTO, collegePO);
        collegeMapper.insertCollege(collegePO);
    }

    /**
     * 查询学院信息
     *
     * @return 学院信息
     */
    @Cacheable(cacheNames = COLLEGE_KEY_NAME)
    @Override
    public Result<List<CollegeVO>> selectCollege() {
        return Result.success(collegeMapper.selectCollege());
    }

    /**
     * 查询学院信息
     *
     * @param collegePageDTO 分页信息
     * @return 分页信息
     */
    @Override
    public PageResult<CollegeVO> pageCollege(CollegePageDTO collegePageDTO) {
        PageUtils.startPage(collegePageDTO);
        return PageResult.success(collegeMapper.pageCollege(collegePageDTO));
    }

    /**
     * 修改学院信息
     *
     * @param collegeDTO 学院信息
     */
    @CacheEvict(cacheNames = COLLEGE_KEY_NAME)
    @Override
    public void updateCollege(CollegeDTO collegeDTO) {
        CollegePO collegePO = new CollegePO();
        BeanUtils.copyProperties(collegeDTO, collegePO);
        collegeMapper.updateCollege(collegePO);
    }

    /**
     * 删除学院信息
     *
     * @param id 学院号
     */
    @CacheEvict(cacheNames = COLLEGE_KEY_NAME)
    @Transactional
    @Override
    public void deleteCollege(Integer id) {
        collegeMapper.insertCollegeDeleted(id);
        collegeMapper.deleteCollege(id);
        // TODO 删除学院信息时 还需要删除与学院相关的信息
    }
}
